IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spSeguridadLogEventos' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spSeguridadLogEventos]
END
GO
CREATE PROCEDURE [dbo].[spSeguridadLogEventos]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL
	,@ID INT=NULL
	,@Host VARCHAR(128)=NULL
	,@Usuario VARCHAR(128)=NULL
	,@Fecha DATETIME=NULL
	,@Evento VARCHAR(256)=NULL
	,@Detalle VARCHAR(max)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON;
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[SeguridadLogEventos] t
	RETURN 0
END

/*****     Devolver una lista todos los eventos registrados en el log, ademas del evento "TODOS"   *****/
IF @OP = 'ListarEventosLog'
BEGIN
	
	SELECT *
	FROM
		(
				SELECT 
					0 as [ID],
					'' AS [Host],
					'' AS [Usuario],
					GETDATE() as [Fecha],
					'TODOS' [Evento],
					'' AS [DETALLE]				
			UNION ALL
				SELECT 
					MAX(t.ID) as [ID],
					MAX(t.Host) AS [Host],
					MAX(t.Usuario) AS [SystemUser],
					MAX(t.Fecha) as [Fecha],
					t.Evento,
					'Z' AS [DETALLE] 
				FROM 
					[dbo].[SeguridadLogEventos] t
				GROUP BY
					t.Evento				
		) as t2
	ORDER BY t2.DETALLE
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;

